library(ggplot2)
penguins <- na.omit(palmerpenguins::penguins)

aes()

Додаткові естетичні атрибути

Мапування даних на додаткові естетичні атрибути окрім осі XY та додатковий контроль над виглядом геометричних елементів графіку

penguins |>
  ggplot(aes(bill_length_mm, bill_depth_mm)) +
  geom_point(
    aes(fill = species),
    color = "black",
    size = 2,
    shape = 21,
    alpha = .5
  ) +
  geom_smooth(
    aes(linetype = species),
    color = "red",
    fill = "powderblue",
    method = lm
  )
## `geom_smooth()` using formula = 'y ~ x'

Створення групи даних

Створення групи даних без безпосереднього зв’язку з певною естетичною шкалою (зверніть увагу, як легенда на графіку нижче відрізняється від легенди на графіку вище)

penguins |>
  ggplot(aes(bill_length_mm, bill_depth_mm)) +
  geom_point(
    aes(fill = species),
    color = "black",
    size = 2,
    shape = 21,
    alpha = .5
  ) +
  geom_smooth(
    aes(group = species),
    color = "red",
    fill = "powderblue",
    method = lm
  )
## `geom_smooth()` using formula = 'y ~ x'

Пригнічення легенди

Один з можливих варіантів контролю відображення легенди атрибутів графіку є зміна значення логічного аргументу show.legend

penguins |>
  ggplot(aes(bill_length_mm, bill_depth_mm)) +
  geom_point(
    aes(fill = species),
    color = "black",
    size = 2,
    shape = 21,
    alpha = .5,
    show.legend = TRUE
  ) +
  geom_smooth(
    aes(linetype = species),
    color = "red",
    fill = "powderblue",
    method = lm,
    show.legend = FALSE
  )
## `geom_smooth()` using formula = 'y ~ x'

Варіант без легенди зовсім

penguins |>
  ggplot(aes(bill_length_mm, bill_depth_mm)) +
  geom_point(
    aes(fill = species),
    color = "black",
    size = 2,
    shape = 21,
    alpha = .5,
    show.legend = FALSE
  ) +
  geom_smooth(
    aes(linetype = species),
    color = "red",
    method = lm,
    fill = "powderblue",
    show.legend = FALSE
  )
## `geom_smooth()` using formula = 'y ~ x'

Нестандартна форма поїнтів

При використанні значень від 32 до 127, поїнт буде зображено за допомогою символу ASCII з відповідним чисельним кодом

penguins |> 
  ggplot(aes(bill_length_mm, bill_depth_mm, color = species)) +
  geom_point(shape = 63, size = 3) # 63 відповідає знаку ? у таблиці ASCII

Формально, можливо також використовувати Unicode-символи

penguins |> 
  ggplot(aes(bill_length_mm, bill_depth_mm, color = species)) +
  geom_point(shape = "\u2665", size = 5, alpha = .5) # ♥

scales

Палітри для неперервних значень

Viridis з самого початку розроблявся як кольорова мапа, тому з його використанням щодо неперервних чисельних значень не виникає проблем. Функція scale_*_viridis_c() створює неперервний градієнт

penguins |> 
  ggplot(aes(bill_length_mm, bill_depth_mm, color = body_mass_g)) +
  geom_point(size = 2) +
  scale_color_viridis_c(option = "B")

Функція scale_*_vridis_b() створює рівновіддалені біни і присвоює їм кольори

penguins |> 
  ggplot(aes(bill_length_mm, bill_depth_mm, color = body_mass_g)) +
  geom_point(size = 2) +
  scale_color_viridis_b(option = "B")

Пресети з ColorBrewer можливо використати для неперервних значень через виклик функції scale_*_distiller(), що створює неперервний градієнт

penguins |> 
    ggplot(aes(bill_length_mm, bill_depth_mm, fill = body_mass_g)) +
    geom_point(size = 2, shape = 21) +
    scale_fill_distiller(palette = "RdBu")

Або через scale_*_fermenter(), що розбиває значення на окремі рівновіддалені біни і присвоює їм кольори

penguins |> 
    ggplot(aes(bill_length_mm, bill_depth_mm, fill = body_mass_g)) +
    geom_point(size = 2, shape = 21) +
    scale_fill_fermenter(palette = "RdBu")

Мануально значення градієнтів можуть бути задані через scale_*_gradient(), _gradient2() та _gradientn().

penguins |> 
    ggplot(aes(bill_length_mm, bill_depth_mm, color = body_mass_g)) +
    geom_point(size = 2) +
    scale_color_gradient(low = "orange", high = "seagreen")

Приклад зі scale_fill_gradient2()

penguins |> 
    ggplot(aes(bill_length_mm, bill_depth_mm, fill = body_mass_g)) +
    geom_point(size = 2, shape = 21) +
    scale_fill_gradient2(
      low = "hotpink", 
      mid = "wheat", 
      high = "limegreen",
      midpoint = 4500
      )

Бінінг значень по кольорам може бути створенний за допомогою scale_*_steps(), _steps2() та _stepsn() за тим же принципом

Дуже довгі підписи на осях

labs <- c("Pygoscelis adeliae", "Pygoscelis antarcticus", "Pygoscelis papua")

Що робити, якщо підписи позначок на осях є занадто довгими і тому перекривають одна одну, а зменшення розміру шрифту не є варіантом?

penguins |> 
  ggplot(aes(species, body_mass_g, fill = sex)) +
  geom_boxplot() +
  scale_x_discrete(
    name = "",
    labels = labs
  )

  1. Реверсувати ось X та Y (можливо не дуже гарно виглядає з боксплотом, але зазвичай гарний вибір для барплота)
# це також можливо зробити через виклик coord_flip()
penguins |> 
  ggplot(aes(body_mass_g, species, fill = sex)) +
  geom_boxplot() +
  scale_y_discrete(
    name = "",
    labels = labs
  ) 

  1. Розмістити підписи на декількох рядках
penguins |> 
  ggplot(aes(species, body_mass_g, fill = sex)) +
  geom_boxplot() +
  scale_x_discrete(
    name = "",
    labels = sub(" ", "\n", labs) # пробіл між словами замінено на esc-послідовність
  )                              # яка позначає початок нового рядку

  1. Розмістити надписи під кутом
penguins |> 
  ggplot(aes(species, body_mass_g, fill = sex)) +
  geom_boxplot() +
  scale_x_discrete(
    name = "",
    labels = labs,
    guide = guide_axis(angle = 45)
  )

  1. Збільшити кількість рядків, які мають бути використані для відображення підписів
penguins |> 
  ggplot(aes(species, body_mass_g, fill = sex)) +
  geom_boxplot() +
  scale_x_discrete(
    name = "",
    labels = labs,
    guide = guide_axis(n.dodge = 2)
  )

Лог засічки на осях

При використанні лог-трансформації доцільним може бути відповідне зображення логарифмічної шкали на осі

gapminder::gapminder |> # це просто бібліотека з датасетом
  subset(year == 1992) |> 
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point() +
  geom_smooth(method = lm) +
  scale_x_log10(
    breaks = scales::breaks_log(),
    labels = scales::label_currency(accuracy = 1)
  )
## `geom_smooth()` using formula = 'y ~ x'

Досягається через аргумент guide (або додатковий шар guides())

gapminder::gapminder |> 
  subset(year == 1992) |> 
  ggplot(aes(gdpPercap, lifeExp)) +
  geom_point() +
  geom_smooth(method = lm) +
  scale_x_log10(
    breaks = scales::breaks_log(),
    labels = scales::label_currency(accuracy = 1),
    guide = "axis_logticks"
  )
## `geom_smooth()` using formula = 'y ~ x'

Замість guide = “axis_logticks” можливо викликати guide_axis_logticks(), що дає додаткові можливості для налаштування параметрів

gapminder::gapminder |> 
    subset(year == 2002) |> 
    ggplot(aes(gdpPercap, lifeExp)) +
    geom_point() +
    geom_smooth(method = lm) +
    scale_x_log10(
        labels = scales::label_currency(accuracy = 1),
        guide = guide_axis_logticks(long = -2.25, mid = -1.5, short = -0.75)
    )
## `geom_smooth()` using formula = 'y ~ x'